from fastapi import APIRouter
from app.data.data_provider import get_stock_data
import json
import akshare as ak
import pandas as pd

router = APIRouter()

@router.get("/{code}")
async def get_stock_kline(code: str, start: str = "20230101", end: str = "20231231"):
    """
    获取指定股票代码在时间范围内的历史K线数据。
    """
    df = get_stock_data(code, start, end)
    if df.empty:
        return {"error": "Could not retrieve data."}
    
    # 重命名列名为英文，确保前端处理的稳定性
    df.rename(columns={
        '日期': 'date',
        '开盘': 'open',
        '收盘': 'close',
        '最高': 'high',
        '最低': 'low',
        '成交量': 'volume'
    }, inplace=True)

    # 选择需要的列发送给前端
    columns_to_send = ['date', 'open', 'close', 'low', 'high', 'volume']
    df_to_send = df[columns_to_send]
    
    # 将DataFrame转换为JSON格式
    return json.loads(df_to_send.to_json(orient="records"))


@router.get("/{code}/info")
async def get_stock_info(code: str):
    """
    获取指定股票代码的公司基本信息。
    """
    try:
        info_df = ak.stock_individual_info_em(symbol=code)
        # 将DataFrame转换为更易于前端处理的 {key: value} 格式
        info_dict = dict(zip(info_df['item'], info_df['value']))
        return info_dict
    except Exception as e:
        return {"error": f"无法获取股票 {code} 的信息: {e}"}

@router.get("/{code}/recent")
async def get_recent_stock_data(code: str, days: int = 30):
    """
    获取指定股票最近N天的历史数据，包括前复权和不复权价格。
    """
    try:
        # 获取前复权数据
        df_qfq = ak.stock_zh_a_hist(symbol=code, period="daily", adjust="qfq").tail(days + 5) # 多取一点以防合并失败
        if df_qfq.empty:
            return {"error": "无法获取前复权数据。"}
        
        # 获取不复权数据
        df_normal = ak.stock_zh_a_hist(symbol=code, period="daily", adjust="").tail(days + 5)
        if df_normal.empty:
            return {"error": "无法获取不复权数据。"}

        # 合并两个DataFrame
        df_merged = pd.merge(
            df_normal[['日期', '开盘', '最高', '最低', '收盘']], 
            df_qfq[['日期', '收盘']], 
            on='日期', 
            how='inner', # 确保只保留两个df中都存在的日期
            suffixes=('', '_前复权')
        )
        df_merged.rename(columns={'收盘_前复权': '前复权收盘'}, inplace=True)
        
        # 截取最近N天的数据
        recent_data = df_merged.tail(days)
        
        return recent_data.to_dict('records')

    except Exception as e:
        return {"error": f"获取近期股价时发生错误: {e}"} 